import random
import re
from datetime import datetime

from flask import abort, jsonify
from flask import current_app
from flask import json
from flask import make_response
from flask import request
from flask import session

from info.Thirdlibs.yuntongxun.sms import CCP
from info import redis_store, db
from info import constants
from info.models import User
from info.utils.captcha.captcha import captcha
from info.utils.response_code import RET
from . import passport_url


@passport_url.route('/image_code')
def image_code():
    # 1获取请求中的参数
    image_code_id = request.args.get('imageCodeId', None)
    # 2判断参数是否为空
    if not image_code_id:
        return abort(403)
    # 3第三方工具生成图片验证码
    name, text, image = captcha.generate_captcha()
    # 4验证码信息储存到redis
    try:
        redis_store.set('imageCodeId_' + image_code_id, text, constants.IMAGE_CODE_REDIS_EXPIRES)
    except Exception as e:
        current_app.logger.error(e)  # 错误信息输出到log日志中
    # 5给前段返回验证码
    response = make_response(image)
    response.headers['Content-Type'] = 'image/jpg'
    return response


@passport_url.route('/sms_code', methods=['POST'])
def sms_code():
    # 1获取请求中的参数（手机号码，输入的验证码，验证码ID）
    # params_dic=json.loads(request.data)
    params_dic = request.json
    mobile = params_dic['mobile']
    image_code = params_dic['image_code']
    image_code_id = params_dic['image_code_id']
    # 2判断手机号码是否为正确的格式
    if not all([mobile, image_code, image_code_id]):
        return jsonify(errno=RET.DATAERR, errmsg='数据错误')
    if not re.match(r'^1[3578][0-9]{9}$', mobile):
        return jsonify(errno=RET.DATAERR, errmsg='请输入正确的手机号格式')
    # 3取出redis中的图片验证码数据做对比
    try:
        real_image_code = redis_store.get('imageCodeId_' + image_code_id)
        # real_image_code = real_image_code.decode()
        print(real_image_code)
        print(image_code)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='数据库查询错误')
    # 如果取出的验证码为空 表示已近过期
    if not real_image_code:
        return jsonify(errno=RET.NODATA, errmsg='验证码过期')
    # 如果取出的验证码和用户输入的验证码队不上
    if real_image_code.upper() != image_code.upper():
        current_app.logger.error('图片校验不通过')
        return jsonify(errno=RET.DATAERR, errmsg='验证码错误')

    # 4生成短信验证码 并存入redis

    # 生成6位数的验证码
    sms_code_str = '%06d' % random.randint(0, 999999)
    current_app.logger.debug('短信验证码为:%s' % sms_code_str)
    # 验证码储存到redis
    try:
        redis_store.set('mobile_' + mobile, sms_code_str, constants.SMS_CODE_REDIS_EXPIRES)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.SERVERERR, errmsg='内部错误')
    # 5发送短信验证
    # result = CCP().send_template_sms(mobile, [sms_code_str, 1], 1)
    # if result != 0:
    #     return jsonify(erron=RET.THIRDERR, errmsg='短信发送失败')

    return jsonify(errno=RET.OK, errmsg='短信发送成功')


@passport_url.route('/register', methods=['POST'])
def register():
    # 1获取参数
    user_dic = request.json
    mobile = user_dic['mobile']
    smscode = user_dic['smscode']
    password = user_dic['password']
    # 2参数的验证
    if not all([mobile, smscode, password]):
        return jsonify(errno=RET.DATAERR, errmsg='数据错误')
    # 3校验短信验证
    try:
        item = redis_store.get('mobile_' + mobile)
        # item = item.decode()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='数据库查询错误')
    if not item:
        return jsonify(errno=RET.NODATA, errmsg='验证码过期')
    if item.upper() != smscode.upper():
        return jsonify(errno=RET.DATAERR, errmsg='验证码错误')
    # 4校验通过就初始化User表单添加属性
    user = User()
    user.mobile = mobile
    user.nick_name = mobile
    # 记录用户最后一次登陆的事件
    user.last_login = datetime.now()
    # 密码加密
    user.password = password

    # # 5讲注册的用户信息添加到数据库
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.IOERR, errmsg='数据库存入失败')

    # 往session中添加数据表示当前已经登陆

    session['user_id'] = user.id
    session['user_mobile'] = user.mobile
    session['nick_name'] = user.nick_name

    # 6返回信息

    return jsonify(errno=RET.OK, errmsg='注册成功')


@passport_url.route('/login', methods=['POST'])
def login():
    # 1.取出参数（电话和密码）
    login_dic = request.json
    mobile = login_dic['mobile']
    password = login_dic['password']
    # 2.验证参数（电话的格式和参数是否存在）
    if not all([mobile, password]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数错误')
    # if not re.match(r'^1[3578][0-9]{9}$', mobile):
    #     return jsonify(errno=RET.DATAERR, errmsg='请输入正确的手机号格式')

    # 3.验证用户是否存在(创建user模型对象)
    try:
        user = User.query.filter(User.mobile == mobile).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='数据库查询错误')

    if not user:
        return jsonify(errno=RET.USERERR, errmsg='用户不存在或未激活')

    # 4.取出密码验证对比
    if not user.check_passowrd(password):
        return jsonify(errno=RET.PWDERR, errmsg='密码错误')

    # 5.登陆成功，保持登陆状态，记录登陆事件

    session['user_id'] = user.id
    session['user_mobile'] = user.mobile
    session['user_nick_name'] = user.nick_name
    session['is_admin'] = user.is_admin

    user.last_login = datetime.now()
    # db.session.commit()
    # 6.给前段返回数据
    return jsonify(errno=RET.OK, errmsg='登陆成功')


@passport_url.route('/logout')
def logout():
    session.pop('user_id', None)
    session.pop('user_mobile', None)
    session.pop('user_nick_name', None)
    session.pop('is_admin', None)


    return jsonify(errno=RET.OK, errmsg='退出登陆')
